package com.br.negocio.controller;

import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

import br.com.caelum.stella.validation.CNPJValidator;

import com.br.negocio.dao.FornecedorDAO;
import com.br.negocio.vo.EnderecoVO;
import com.br.negocio.vo.FornecedorVO;
import com.br.negocio.vo.ResponsavelVO;
import com.br.negocio.vo.home.TipoFornecedorHome;
import com.br.util.validator.ValidaCPF;
import com.br.util.validator.ValidaEmail;

@Service("controllerFornecedor")
public class ControllerFornecedor {

	@Resource
	private FornecedorDAO fornecedorDAO;
	
	public void inserirFornecedor(FornecedorVO fornecedorVO) {
		
		this.validaFornecedor(fornecedorVO);

		fornecedorVO.setDataCriacao(new Date());
		fornecedorVO.setDataAlteracao(new Date());
		fornecedorDAO.inserirFornecedor(fornecedorVO);
	}
	
	public void atualizarFornecedor(FornecedorVO fornecedorVO) {
		
		this.validaFornecedor(fornecedorVO);

		fornecedorVO.setDataAlteracao(new Date());
		fornecedorDAO.atualizarFornecedor(fornecedorVO);
	}
	
	private void validaFornecedor(FornecedorVO fornecedorVO) {
		if (fornecedorVO == null) {
			throw new IllegalArgumentException("Um fornecedor v�lido � obrigat�rio.");
		}
		
		ValidaEmail email = new ValidaEmail();
		
		if (!email.valida(fornecedorVO.getEmail())){
			throw new IllegalArgumentException("Erro: um email v�lido � obrigat�rio.");
		}
		
		if (fornecedorVO.getTipoFornecedor() == TipoFornecedorHome.FISICO) {
			
			
			if ((fornecedorVO.getNome() == null) ||
					(fornecedorVO.getNome().equals(""))) {
					throw new IllegalArgumentException("Um nome � necess�rio para o fornecedor.");
				} else if (fornecedorVO.getNome().trim().equals("")) {
					throw new IllegalArgumentException("O campo nome n�o pode conter apenas espa�o(s) em branco.");
				}
			
			
			if ((fornecedorVO.getCpfCnpj() == null) ||
				(fornecedorVO.getCpfCnpj().trim().equals(""))) {
				throw new IllegalArgumentException("Um CPF � necess�rio para o fornecedor.");
			}
			
			ValidaCPF validaCPF = new ValidaCPF();
			
			if (!validaCPF.valida(fornecedorVO.getCpfCnpj())) {
				throw new IllegalArgumentException("Um CPF v�lido � necess�rio para o fornecedor.");
			}
			

			if (fornecedorVO.getData() == null) {
				throw new IllegalArgumentException("Uma data de nascimento � necess�ria para o fornecedor.");
			}
			
			if (fornecedorVO.getData().compareTo(new Date()) > 0) {
				throw new IllegalArgumentException("Data de nascimento n�o pode ser maior que data atual.");
			}
			
			if ((fornecedorVO.getTelefoneComercial() == null) ||
					(fornecedorVO.getTelefoneComercial().equals(""))) {
					throw new IllegalArgumentException("Um telefone Comercial � necess�rio para o fornecedor.");
				} else if (fornecedorVO.getTelefoneComercial().trim().equals("")) {
					throw new IllegalArgumentException("O campo telefone n�o pode conter apenas espa�o(s) em branco.");
				}
			
			this.validaEndereco(fornecedorVO.getEnderecoVO());
			
			
			fornecedorVO.setResponsavelVO(new ResponsavelVO());
			
		} else if (fornecedorVO.getTipoFornecedor() == TipoFornecedorHome.JURIDICO) {
			
			
			if ((fornecedorVO.getNome() == null) ||
					(fornecedorVO.getNome().equals(""))) {
					throw new IllegalArgumentException("Um razao social e necessario para o fornecedor.");
				} else if (fornecedorVO.getNome().trim().equals("")) {
					throw new IllegalArgumentException("O campo razao social nao pode conter apenas espaco(s) em branco.");
				}
			
			
			if ((fornecedorVO.getCpfCnpj() == null) ||
				(fornecedorVO.getCpfCnpj().trim().equals(""))) {
				throw new IllegalArgumentException("Um CNPJ e necessario para o fornecedor.");
			}
			
			
			CNPJValidator cNPJValidator = new CNPJValidator();
			
			try {
				cNPJValidator.assertValid(fornecedorVO.getCpfCnpj());
			} catch (Exception e) {
				throw new IllegalArgumentException("Um CNPJ valido e necesserio para o fornecedor.");
			}
						
			if ((fornecedorVO.getTelefoneResidencial() == null) ||
				(fornecedorVO.getTelefoneResidencial().equals(""))) {
				throw new IllegalArgumentException("Um telefone Comercial e necesserio para o fornecedor.");
			} else if (fornecedorVO.getTelefoneResidencial().trim().equals("")) {
				throw new IllegalArgumentException("O campo telefone n�o pode conter apenas espaco(s) em branco.");
			}
			
			this.validaEndereco(fornecedorVO.getEnderecoVO());
			
			if (fornecedorVO.getResponsavelVO() == null) {
				throw new IllegalArgumentException("Um repons�vel v�lido � obrigat�rio para o fornecedor.");
			}
			
			if ((fornecedorVO.getResponsavelVO().getNome() == null) ||
				(fornecedorVO.getResponsavelVO().getNome().equals(""))) {
				throw new IllegalArgumentException("Um nome � necess�rio para o respons�vel pelo fornecedor.");
			} else if (fornecedorVO.getResponsavelVO().getNome().trim().equals("")) {
				throw new IllegalArgumentException("O campo nome do respons�vel n�o pode conter apenas espa�o(s) em branco.");
			}
		}
		
	}
	
	
private void validaEndereco(EnderecoVO enderecoVO) {
		
		
		if (enderecoVO.getCidadeVO() == null) {
			throw new IllegalArgumentException("Uma cidade v�lida � necess�ria.");
		}
		
		if (enderecoVO.getCidadeVO().getCodigo() == 0) {
			throw new IllegalArgumentException("� necess�rio selecionar uma cidade para o cliente.");
		}
		
		
		if ((enderecoVO.getLogradouro() == null) ||
			(enderecoVO.getLogradouro().equals(""))) {
			throw new IllegalArgumentException("Um logradouro � necess�rio para o cliente.");
		} else if (enderecoVO.getLogradouro().trim().equals("")) {
			throw new IllegalArgumentException("O campo nome do logradouro n�o pode conter apenas espa�o(s) em branco.");
		}
		
		if ((enderecoVO.getBairro() == null) ||
			(enderecoVO.getBairro().equals(""))) {
			throw new IllegalArgumentException("Um bairro � necess�rio para o cliente.");
		} else if (enderecoVO.getBairro().trim().equals("")) {
			throw new IllegalArgumentException("O campo nome do bairro n�o pode conter apenas espa�o(s) em branco.");
		}
		
		if ((enderecoVO.getCep() == null) ||
			(enderecoVO.getCep().equals(""))) {
			throw new IllegalArgumentException("Um CEP � necess�rio para o cliente.");
		}
		
		if ((enderecoVO.getNumero() == null) ||
			(enderecoVO.getNumero().equals(""))) {
			throw new IllegalArgumentException("Um n�mero � necess�rio para o cliente.");
		} else if (enderecoVO.getNumero().trim().equals("")) {
			throw new IllegalArgumentException("O campo nome do n�mero n�o pode conter apenas espa�o(s) em branco.");
		}
		
		
	}
	
	

	public void removerFornecedor(FornecedorVO fornecedorVO) {
		
		if (fornecedorVO == null) {
			throw new IllegalArgumentException("Um fornecedor valido � obrigatorio.");
		}
		
		if (fornecedorVO.getCodigo() == 0) {
			throw new IllegalStateException("A entidade tem um codigo invalido: " + fornecedorVO.getNome());
		}
		
		fornecedorDAO.removerFornecedor(fornecedorVO);
	}

	public FornecedorVO obterFornecedor(FornecedorVO fornecedorVO) {
		
		if (fornecedorVO == null) {
			throw new IllegalArgumentException("Um fornecedor valido e obrigatorio.");
		}

		return fornecedorDAO.obterFornecedor(fornecedorVO);
	}

	public List<FornecedorVO> obterListaFornecedor() {
		return fornecedorDAO.obterListaFornecedor();
	}
	
}